package com.sdonkey.score.util;

/**
 * 有关日期工具类(extends TimeUtil)
 * 
 * TimeUtil主要功能有：
 * 1.各种日期类型（字符，util.Date，sql.Date，Calendar等）转换
 * 2.获取指定日期的年份，月份，日份，小时，分，秒，毫秒
 * 3.获取当前/系统日期(指定日期格式)
 * 4.获取字符日期一个月的天数
 * 5.获取指定月份的第一天,最后一天
 * 
 * DateUtil主要功能有：
 * 1.日期比较
 * 2.获取2个字符日期的天数差，周数差，月数差，年数差
 * 3.日期添加
 * 4.判断给定日期是不是润年
 */

import java.sql.Timestamp;
import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.GregorianCalendar;

public abstract class TimeUtil {

	// ---当前日期的年，月，日，时，分，秒
	public static Calendar cal = Calendar.getInstance();
	int year = cal.get(Calendar.YEAR);
	int date = cal.get(Calendar.DAY_OF_MONTH);
	int month = cal.get(Calendar.MONTH) + 1;
	int hour = cal.get(Calendar.HOUR);
	int min = cal.get(Calendar.MINUTE);
	int sec = cal.get(Calendar.SECOND);
	
	public static Timestamp now(){
		return new Timestamp(cal.getTimeInMillis());
	
	}
	
	
	/**
	 * 获取时间戳
	 * 
	 * @return
	 */
	public static String getTimeStamp() {
		return String.valueOf(System.currentTimeMillis());
	}
	
	
	
	
	

	// -------------------------------日期类型转换---------------------------------------------------------------------------
	/**
	 * 字符型日期转化util.Date型日期
	 * 
	 * @Param:p_strDate 字符型日期
	 * @param p_format
	 *            格式:"yyyy-MM-dd" / "yyyy-MM-dd hh:mm:ss"
	 * @Return:java.util.Date util.Date型日期
	 * @Throws: ParseException
	 * @Author: zhuqx
	 * @Date: 2006-10-31
	 */
	public static Date toUtilDateFromStrDateByFormat(
			String p_strDate, String p_format) throws ParseException {
		Date l_date = null;
		DateFormat df = new SimpleDateFormat(p_format);
		if (p_strDate != null && (!"".equals(p_strDate)) && p_format != null
				&& (!"".equals(p_format))) {
			l_date = df.parse(p_strDate);
		}
		return l_date;
	}

	/**
	 * 字符型日期转化成sql.Date型日期
	 *
	 * @param p_strDate
	 *            字符型日期
	 * @return java.sql.Date sql.Date型日期
	 * @throws ParseException
	 * @Author: zhuqx
	 * @Date: 2006-10-31
	 */
	public static java.sql.Date toSqlDateFromStrDate(String p_strDate)
			throws ParseException {
		java.sql.Date returnDate = null;
		DateFormat sdf = new SimpleDateFormat();
		if (p_strDate != null && (!"".equals(p_strDate))) {
			returnDate = new java.sql.Date(sdf.parse(p_strDate).getTime());
		}
		return returnDate;
	}

	/**
	 * util.Date型日期转化指定格式的字符串型日期
	 *
	 * @param p_date
	 *            Date
	 * @param p_format
	 *            String 格式1:"yyyy-MM-dd" 格式2:"yyyy-MM-dd hh:mm:ss EE"
	 *            格式3:"yyyy年MM月dd日 hh:mm:ss EE" 说明: 年-月-日 时:分:秒 星期 注意MM/mm大小写
	 *            格式4:"yyyyMMddHHmmss"
	 * @return String
	 * @Author: zhuqx
	 * @Date: 2006-10-31
	 */
	public static String toStrDateFromUtilDateByFormat(
			Date p_utilDate, String p_format) throws ParseException {
		String l_result = "";
		if (p_utilDate != null) {
			SimpleDateFormat sdf = new SimpleDateFormat(p_format);
			l_result = sdf.format(p_utilDate);
		}
		return l_result;
	}

	/**
	 * util.Date型日期转化转化成Calendar日期
	 *
	 * @param p_utilDate
	 *            Date
	 * @return Calendar
	 * @Author: zhuqx
	 * @Date: 2006-10-31
	 */
	public static Calendar toCalendarFromUtilDate(Date p_utilDate) {
		Calendar c = Calendar.getInstance();
		c.setTime(p_utilDate);
		return c;
	}

	/**
	 * util.Date型日期转化sql.Date(年月日)型日期
	 *
	 * @Param: p_utilDate util.Date型日期
	 * @Return: java.sql.Date sql.Date型日期
	 * @Author: zhuqx
	 * @Date: 2006-10-31
	 */
	public static java.sql.Date toSqlDateFromUtilDate(Date p_utilDate) {
		java.sql.Date returnDate = null;
		if (p_utilDate != null) {
			returnDate = new java.sql.Date(p_utilDate.getTime());
		}
		return returnDate;
	}

	/**
	 * util.Date型日期转化sql.Time(时分秒)型日期
	 *
	 * @Param: p_utilDate util.Date型日期
	 * @Return: java.sql.Time sql.Time型日期
	 * @Author: zhuqx
	 * @Date: 2006-10-31
	 */
	public static java.sql.Time toSqlTimeFromUtilDate(Date p_utilDate) {
		java.sql.Time returnDate = null;
		if (p_utilDate != null) {
			returnDate = new java.sql.Time(p_utilDate.getTime());
		}
		return returnDate;
	}

	/**
	 * util.Date型日期转化sql.Date(时分秒)型日期
	 *
	 * @Param: p_utilDate util.Date型日期
	 * @Return: java.sql.Timestamp sql.Timestamp型日期
	 * @Author: zhuqx
	 * @Date: 2006-10-31
	 */
	public static Timestamp toSqlTimestampFromUtilDate(
			Date p_utilDate) {
		Timestamp returnDate = null;
		if (p_utilDate != null) {
			returnDate = new Timestamp(p_utilDate.getTime());
		}
		return returnDate;
	}

	/**
	 * sql.Date型日期转化util.Date型日期
	 *
	 * @Param: sqlDate sql.Date型日期
	 * @Return: java.util.Date util.Date型日期
	 * @Author: zhuqx
	 * @Date: 2006-10-31
	 */
	public static Date toUtilDateFromSqlDate(java.sql.Date p_sqlDate) {
		Date returnDate = null;
		if (p_sqlDate != null) {
			returnDate = new Date(p_sqlDate.getTime());
		}
		return returnDate;
	}

	// -----------------获取指定日期的年份，月份，日份，小时，分，秒，毫秒----------------------------
	/**
	 * 获取指定日期的年份
	 *
	 * @param p_date
	 *            util.Date日期
	 * @return int 年份
	 * @author zhuqx
	 * @Date: 2006-10-31
	 */
	public static int getYearOfDate(Date p_date) {
		Calendar c = Calendar.getInstance();
		c.setTime(p_date);
		return c.get(Calendar.YEAR);
	}

	/**
	 * 获取指定日期的月份
	 *
	 * @param p_date
	 *            util.Date日期
	 * @return int 月份
	 * @author zhuqx
	 * @Date: 2006-10-31
	 */
	public static int getMonthOfDate(Date p_date) {
		Calendar c = Calendar.getInstance();
		c.setTime(p_date);
		return c.get(Calendar.MONTH) + 1;
	}

	/**
	 * 获取指定日期的日份
	 *
	 * @param p_date
	 *            util.Date日期
	 * @return int 日份
	 * @author zhuqx
	 * @Date: 2006-10-31
	 */
	public static int getDayOfDate(Date p_date) {
		Calendar c = Calendar.getInstance();
		c.setTime(p_date);
		return c.get(Calendar.DAY_OF_MONTH);
	}

	/**
	 * 获取指定日期的小时
	 *
	 * @param p_date
	 *            util.Date日期
	 * @return int 日份
	 * @author zhuqx
	 * @Date: 2006-10-31
	 */
	public static int getHourOfDate(Date p_date) {
		Calendar c = Calendar.getInstance();
		c.setTime(p_date);
		return c.get(Calendar.HOUR_OF_DAY);
	}

	/**
	 * 获取指定日期的分钟
	 *
	 * @param p_date
	 *            util.Date日期
	 * @return int 分钟
	 * @author zhuqx
	 * @Date: 2006-10-31
	 */
	public static int getMinuteOfDate(Date p_date) {
		Calendar c = Calendar.getInstance();
		c.setTime(p_date);
		return c.get(Calendar.MINUTE);
	}

	/**
	 * 获取指定日期的秒钟
	 *
	 * @param p_date
	 *            util.Date日期
	 * @return int 秒钟
	 * @author zhuqx
	 * @Date: 2006-10-31
	 */
	public static int getSecondOfDate(Date p_date) {
		Calendar c = Calendar.getInstance();
		c.setTime(p_date);
		return c.get(Calendar.SECOND);
	}

	/**
	 * 获取指定日期的毫秒
	 *
	 * @param p_date
	 *            util.Date日期
	 * @return long 毫秒
	 * @author zhuqx
	 * @Date: 2006-10-31
	 */
	public static long getMillisOfDate(Date p_date) {
		Calendar c = Calendar.getInstance();
		c.setTime(p_date);
		return c.getTimeInMillis();
	}

	/**
	 * 得到php格式的time,返回当前时间的 Unix 时间戳。
	 *
	 * @return
	 */
	public static String getPHPTime() {
		return System.currentTimeMillis() / 1000 + "";
	}

	// -----------------获取当前/系统日期(指定日期格式)-----------------------------------------------------------------------------------
	/**
	 * 获取指定日期格式当前日期的字符型日期
	 *
	 * @param p_format
	 *            日期格式 格式1:"yyyy-MM-dd" 格式2:"yyyy-MM-dd hh:mm:ss EE"
	 *            格式3:"yyyy年MM月dd日 hh:mm:ss EE" 说明: 年-月-日 时:分:秒 星期 注意MM/mm大小写
	 * @return String 当前时间字符串
	 * @author zhuqx
	 * @Date: 2006-10-31
	 */
	public static String getNowOfDateByFormat(String p_format) {
		Date d = new Date();
		SimpleDateFormat sdf = new SimpleDateFormat(p_format);
		String dateStr = sdf.format(d);
		return dateStr;
	}

	/**
	 * 获取指定日期格式系统日期的字符型日期
	 *
	 * @param p_format
	 *            日期格式 格式1:"yyyy-MM-dd" 格式2:"yyyy-MM-dd hh:mm:ss EE"
	 *            格式3:"yyyy年MM月dd日 hh:mm:ss EE" 说明: 年-月-日 时:分:秒 星期 注意MM/mm大小写
	 * @return String 系统时间字符串
	 * @author zhuqx
	 * @Date: 2006-10-31
	 */
	public static String getSystemOfDateByFormat(String p_format) {
		long time = System.currentTimeMillis();
		Date d = new Date(time);
		SimpleDateFormat sdf = new SimpleDateFormat(p_format);
		String dateStr = sdf.format(d);
		return dateStr;
	}

	/**
	 * 获取字符日期一个月的天数
	 *
	 * @param p_date
	 * @return 天数
	 * @author zhuqx
	 */
	public static long getDayOfMonth(Date p_date) throws ParseException {
		int year = getYearOfDate(p_date);
		int month = getMonthOfDate(p_date) - 1;
		int day = getDayOfDate(p_date);
		int hour = getHourOfDate(p_date);
		int minute = getMinuteOfDate(p_date);
		int second = getSecondOfDate(p_date);
		Calendar l_calendar = new GregorianCalendar(year, month, day, hour,
				minute, second);
		return l_calendar.getActualMaximum(Calendar.DAY_OF_MONTH);
	}

	// -----------------获取指定月份的第一天,最后一天
	// ---------------------------------------------------------------------------
	/**
	 * 获取指定月份的第一天
	 *
	 * @param p_strDate
	 *            指定月份
	 * @param p_formate
	 *            日期格式
	 * @return String 时间字符串
	 * @author zhuqx
	 * @Date: 2006-10-31
	 */
	public static String getDateOfMonthBegin(String p_strDate, String p_format)
			throws ParseException {
		Date date = toUtilDateFromStrDateByFormat(p_strDate, p_format);
		return toStrDateFromUtilDateByFormat(date, "yyyy-MM") + "-01";
	}

	/**
	 * 获取指定月份的最后一天
	 *
	 * @param p_strDate
	 *            指定月份
	 * @param p_formate
	 *            日期格式
	 * @return String 时间字符串
	 * @author zhuqx
	 * @Date: 2006-10-31
	 */
	public static String getDateOfMonthEnd(String p_strDate, String p_format)
			throws ParseException {
		Date date = toUtilDateFromStrDateByFormat(
				getDateOfMonthBegin(p_strDate, p_format), p_format);
		Calendar calendar = Calendar.getInstance();
		calendar.setTime(date);
		calendar.add(Calendar.MONTH, 1);
		calendar.add(Calendar.DAY_OF_YEAR, -1);
		return toStrDateFromUtilDateByFormat(calendar.getTime(), p_format);
	}

}